<?php


namespace app\api\controller\v26;


use app\common\cachemodel\MentalQuestionModel;
use app\common\cachemodel\MentalUserRecordModel;
use app\common\cachemodel\Orders;
use app\common\lib\MentalTestUtil;
use app\common\lib\SensorsData;
use Exception;
use think\Controller;
use think\Db;
use think\Log;
use think\response\Json;

/**
 * 给壹心理的开放请求接口 无签名权限校验
 * Class MentalTestController
 * @support v2.5.5
 * @author Mark
 * @package app\api\controller\v26
 */
class MentalTestController extends Controller
{
    /**
     * 写入日志前缀
     * @var string
     */
    private static $LOG_PRE = 'MentalTestController';

    /**
     * 支付通知接口（壹心理服务器在微信、支付宝支付成功的时候调用）
     * @param int channelId 渠道ID
     * @param int openUserId 准了中的用户ID
     * @param int orderNo 订单号
     * @param int scalePoolId 问题ID
     * @param int tradeType 支付方式 [11 => 支付宝支付,17 => 微信支付]
     * @support v2.5.5
     * @method GET
     * @return Json
     * @throws Exception
     */
    public function payNotify(): ?Json
    {
        //todo 壹心理接口未开发完，待测试
        $channelId = input('channelId/d', 0);
        $openUserId = input('openUserId/d', 0);
        $orderNo = input('orderNo/d', 0);
        $scalePoolId = input('scalePoolId/d', 0);
        $tradeType = input('tradeType/d', 0);//17=>微信支付；11=>支付宝支付；


        //数据校验
        $err_msg = '';
        if ($channelId !== (int)config('mental_test.channel_id'))
        {
            $err_msg = 'channelId异常！';
        }
        if (!in_array($tradeType, [17, 11], true))
        {
            $err_msg = '支付方式错误！';
        }

        if ($err_msg !== '')
        {
            Log::write(self::$LOG_PRE . '支付通知接口（壹心理服务器在微信、支付宝支付成功的时候调用）：$err_msg=' . $err_msg, 'error');
            return show(config('code.error'), 'channelId异常！');
        }


        //查询订单是否已完成
        $result = MentalTestUtil::queryOrder($orderNo);
        if ($result['is_sucess'])
        {
            $is_sucess = false;

            $orderCacheModel = new Orders();
            //查询订单是否属于该用户
            $order = $orderCacheModel->getInfoById($orderNo);
            //支付方式   1=>支付宝,2=>微信支付 //11=>支付宝支付；17=>微信支付；
            if ($order && (int)$order['status'] !== 4 && (int)$order['order_type'] === 18 && (int)$order['uid'] === $openUserId && (int)$order['order_id'] === $orderNo && ($tradeType === 11 ? ((int)$order['trade_type'] === 1) : ((int)$order['trade_type'] === 2)))
            {
                //校验问题 是否与 解锁id 一致
                $mentalQuestionModel = new MentalQuestionModel();
                $question = $mentalQuestionModel->getQuestionDetailById((int)$order['gid'], ['id', 'ocategory', 'online_type', 'type', 'name', 'detail_desc', 'child_scales', 'oid']);
                if (!$question)
                {
                    return show(config('code.error'), '测评问题不存在！');
                }

                $valids = MentalTestUtil::validChildId($question, (int)$order['extend']);
                if (!$valids[0])
                {
                    return show(config('code.error'), '问题id和解锁id不一致！');
                }

                $child_scales = json_decode($question['child_scales'], true);
                $is_scalePoolId_in = false;
                if (count($child_scales) > 0)
                {
                    foreach ($child_scales as $k => $v)
                    {
                        if ($v['scalePoolId'] === $scalePoolId)
                        {
                            $is_scalePoolId_in = true;
                        }
                    }
                } else if ((int)$question['oid'] === $scalePoolId)
                {
                    $is_scalePoolId_in = true;
                }
                if (!$is_scalePoolId_in)
                {
                    return show(config('code.error'), '问题id和解锁id不一致！');
                }


                if ((int)$order['gid'] === (int)$question['id'])
                {//如果订单状态不为4，那么才进行新增操作（有可能，用户已经通过查询心理测试的状态，改变了订单状态）
                    try
                    {
                        Db::startTrans();
                        //更新订单状态
                        $is_sucess = $orderCacheModel->UpdateData($orderNo, ['status' => 4], 4);
                        //新增测评记录
                        (new MentalUserRecordModel())->saveData([
                            'uid' => $openUserId,
                            'qid' => $order['gid'],
                            'child_id' => $order['extend'],
                            'order_id' => $orderNo,
                            'account_id' => $result['account_id'],
                            'create_time' => time(),
                        ]);
                        Db::commit();
                    }
                    catch (Exception $e)
                    {
                        Db::rollback();
                        Log::write('心理测试修改订单失败：' . $e->getMessage(), 'error');
                    }

                    try
                    {
                        #神策打点 105 心理测评支付成功 MentalTestBuySuccess
                        $sensorsTrackData = [
                            'test_id' => (int)$order['gid'],// 测评ID NUMBER
                            'test_name' => $question['name'],// 测评名称 STRING
                            'test_category' => $question['ocategory'],// 测评分类 STRING
                            'test_child_id' => (int)$order['extend'],// 测评版本ID NUMBER
                            'test_child_name' => $valids[1]['name'] ?? '',// 测评版本名称 NUMBER
                            'total_amount' => $order['total_amount'],// 实付价格 NUMBER
                            'order_id' => $order['order_id'],// 订单编号 STRING
                            'trade_type' => (int)$order['trade_type'],// 支付方式 NUMBER
                            'is_success' => true,// 是否成功 BOOL
                            'failed_reson' => '',// 失败原因 STRING
                        ];

                        SensorsData::track($order['uid'], true, 'MentalTestBuySuccess', $sensorsTrackData);
                    }
                    catch (\Exception $e)
                    {
                        Log::write('神策打点-105-心理测评支付成功打点失败：' . $e->getMessage() . '[' . $e->getFile() . ':' . $e->getLine() . ']', 'error');
                    }
                }
            }

            if ($is_sucess)
            {
                return show(config('code.success'), '成功！');
            }

            Log::write(self::$LOG_PRE . '支付通知接口（壹心理服务器在微信、支付宝支付成功的时候调用）：订单数据【' . json_encode($order) . '】，请求数据：【' . json_encode($this->request->param(), JSON_UNESCAPED_SLASHES | JSON_UNESCAPED_UNICODE) . '】', 'error');
            return show(config('code.error'), '失败！');
        }

        Log::write(self::$LOG_PRE . '支付通知接口（壹心理服务器在微信、支付宝支付成功的时候调用）：请求壹心理服务器出错【' . json_encode($result, JSON_UNESCAPED_SLASHES | JSON_UNESCAPED_UNICODE) . '】，请求数据：【' . json_encode($this->request->param()) . '】', 'error');
        return show(config('code.error'), '失败！');
    }

}
